package 中等.哈希表;

import java.util.HashMap;
import java.util.Map;

/**
 * 给你一个数组 nums ，数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各
 * 个数字位反转得到的结果。比方说 rev(123) = 321 ， rev(120) = 21 。我们
 * 称满足下面条件的下标对 (i, j) 是 好的 ：
 * 0 <= i < j < nums.length
 * nums[i] + rev(nums[j]) == nums[j] + rev(nums[i])
 * 请你返回好下标对的数目。由于结果可能会很大，请将结果对 109 + 7 取余 后返回。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/count-nice-pairs-in-an-array
 */
public class 统计一个数组中好对子的数目_1814 {

    public static void main(String[] args) {

        int temp = 270, j = 0;
        while (temp > 0) {
            j = j * 10 + temp % 10;
            temp /= 10;
        }
        System.out.println(j);

    }

    /**
     * 哈希表 + 转换思路
     * 1，将 nums[i] + rev(nums[j]) == nums[j] + rev(nums[i]) 转换为
     * nums[i] - rev(nums[i]) == nums[j] - rev(nums[j])
     * 让等式两边只与当前数字有关
     * 2，nums[j] - rev(nums[j]) 可以凑成的对数是 [0,j-1] 中出现 = nums[j] - rev(nums[j])
     * 的次数
     * 3，一个方法比两个方法快...
     */
    public int countNicePairs(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();

        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            int revNum = 0;
            while (num > 0) {
                revNum = revNum * 10 + num % 10;
                num /= 10;
            }
            int nice = nums[i] - revNum;

            count += map.getOrDefault(nice, 0);
            count %= 1000000007;

            map.put(nice, map.getOrDefault(nice, 0) + 1);
        }
        return count;
    }

}
